#ifndef CAMINO_H_
#define CAMINO_H_

#include "Contenido.h"
#include "Bonus.h"

class Camino: public Contenido{

	private:
	
		Bonus* bonus;
	public:

		Camino(int fila, int columna){
			Camino::Camino();
			this->setPosicion(fila,columna);
		}

		Camino(){
			this->setTextura('.');
			this->bonus = 0;
		}

		Bonus* getBonus(){

			return this->bonus;
		}

		void setPosicion(int fila, int columna){
			Contenido::setPosicion(fila,columna);
			if(this->bonus)
				this->bonus->setPosicion(this->getFila(),this->getColumna());
		}

		void setBonus(Bonus* bonus){

			this->bonus = bonus;
		}

		void imprimir(){

			if(this->bonus == 0){
				std::cout<< this->getTextura();
			}else{
				this->bonus->imprimir();
			}

		}

		bool esCamino(){
			return true;
		}

		void imprimir2(){
			if(this->bonus != NULL){
				this->bonus->imprimir2();
			}else{
				if(!this->hayCaminoVecino()){
					cout << ". ";
				}else{
					if(hayCaminoAlCostado() && !hayCaminoArribaOAbajo()){
						cout << "- ";
					}else{
						if(!hayCaminoAlCostado() && hayCaminoArribaOAbajo()){
							cout << "| ";
						}else{
							cout << "+ ";
						}
					}
				}
			}
		}

		~Camino(){
		
			if(this->bonus)
				delete bonus;
		}

	private:
		
		bool hayCaminoEnLaCasilla(int fila, int columna){
			Casillero* casilla = NULL;
			try{
				casilla = Escenario::getInstance()->getGrilla()->getCasillero(fila, columna );
			}catch(PositionOutOfBoundException* e){
				delete e;
				return false;
			}
			if((casilla->getContenido())&&(casilla->getContenido()->esCamino()))
				return true;
			return false;
		}
		
		bool hayCaminoAlCostado(){
			return hayCaminoEnLaCasilla(this->getFila(), this->getColumna() - 1) || hayCaminoEnLaCasilla(this->getFila(), this->getColumna() + 1);
		}

		bool hayCaminoArribaOAbajo(){
			return hayCaminoEnLaCasilla(this->getFila() - 1, this->getColumna()) || hayCaminoEnLaCasilla(this->getFila() + 1, this->getColumna());
		}

		bool hayCaminoVecino(){
			return hayCaminoAlCostado() || hayCaminoArribaOAbajo();
		}

};

#endif